// 用户信息仓库

import { getUserInfo, login } from '@/api/user'
import { constantRoutes, resetRouter } from '@/router'
import { setToken, removeToken, getToken } from '@/utils/auth'

const state = {
  token: getToken() || '',
  userInfo: {}, // 用户信息
  routes: constantRoutes // 用户所有的路由规则
}

const mutations = {
  // temp 是我昨天辛苦筛选出来的一个用户专属的路由规则数组
  setRoutes(state, newRoutes) {
    state.routes = [...constantRoutes, ...newRoutes] // 静态路由规则+自己的动态路由规则
  },
  setToken: (state, token) => {
    state.token = token // 存到仓库里
    // 存本地存储
    // localStorage.setItem('token', token)
    setToken(token)
  },
  removeToken: (state) => {
    state.token = '' // 删的仓库的数据
    // 本地存储也得删
    // localStorage.removeItem('token')
    removeToken()
  },
  setUserInfo: (state, userInfo) => {
    state.userInfo = userInfo
  },
  // 清除用户资料
  removeUserInfo: (state) => {
    state.userInfo = {}
  }
}

const actions = {
  async login(context, obj) {
    // ... 请求后端 => 封装api
    const res = await login(obj)
    console.log(res)
    // 拿到token后存到仓库里
    context.commit('setToken', res)
  },
  // 调用action获取用户资料的时机:
  // 1. layout组件created中调用-晚了-进到这个layout才去请求-希望进到这个layout已经看到用户资料了
  // 2. 路由前置守卫中请求 拿到资料后 再放行
  async getUserInfo(context) {
    // 请求
    // await xx()
    const res = await getUserInfo()
    console.log(res)
    // 调用刚刚的mutation
    context.commit('setUserInfo', res)
    return res
  },
  // 也有可能批量处理mutation
  logout(context) {
    // 1. 删除token
    context.commit('removeToken')
    // 2. 删除用户信息
    context.commit('removeUserInfo')

    // 3. 重置路由规则 => 下一个账号登录进来 不应该是基于之前账号添加的规则
    resetRouter() // 花哥准备好了
  }
}

export default {
  namespaced: true,
  state: state,
  mutations: mutations,
  actions: actions
}

